杨辉三角--(方法一)

 import java.math.BigInteger;

/**
 * 类名: TestYangHuiSanJiao 说明: 用三种方法输出"杨辉三角" 注: 最简单的方法就是是定义一个二维数组, 保存产生的所有"杨辉三角"值, 但是如果要输入一个比较大的"杨辉三角"(如* 100000行),就必需申请一个100000 * 100000的数组,那就需要37多G的内存,正常工作或者家用电脑应该没有能达到这个 要求的,就算是10000 * 10000 的数组也需要400M左右的内存.
 * 所以,只需要记录对后面计算有用的"杨辉三角"值.
 */
public class TestYangHuiSanJiao
{
    public static void main(String[] args)
    {
        YangHui1 yangHuiTest = new YangHui1(100);
        yangHuiTest.printYangHui();
    }
}

/**
 * 类名: YangHui1 说明: 定义两个一维数组,分别记录上一行的值和当前行的值 注: 当前行的"杨辉三角"值完全依赖于上一行的值,而当前行的值会影响下一行的值的计算,故利用上一行的值计算当前行的值,并记录当前行的值用于下一行的计算.
 */
class YangHui1
{
    BigInteger[]    arr1;    // 定义数组记录上一行的值;
    BigInteger[]    arr2;    // 定义数组记录当前行的值, 计算完成后将本数组值赋给arr1,用于下一次计算
    int                intNum; // 记录"杨辉三角"行数

    /**
     * 入口参数: "杨辉三角"行数 说明: 类变量初始化过程
     */
    YangHui1(int intNum) // 构造函数
    {
        arr1 = new BigInteger[intNum]; // "杨辉三角"一行最多有N个值,根据需要定义数组大小
        arr2 = new BigInteger[intNum];
        this.intNum = intNum; // 记录"杨辉三角"行数
        arr1[0] = BigInteger.valueOf(1); // 每行第一个元素始终为1
        arr2[0] = BigInteger.valueOf(1);

        for (int i = 1; i < arr1.length; i++)
        {
            arr2[i] = BigInteger.valueOf(0); // 对象数组初始化过程
            arr1[i] = BigInteger.valueOf(0); // 对象数组初始化过程
        }
    }

    void printYangHui() // 计算并打印"杨辉三角"
    {
        System.out.println(arr2[0]); // 第一行为特殊情况,故直接打印

        for (int i = 1; i < intNum; i++) // 进入循环,从第2行开始计算打印"杨辉三角"
        {
            System.out.print(arr2[0] + "/t"); // 打印每行第1个值

            // 说明: 用上一行下标小1和同下标元素得到当前元素, 这时上一行下标小1的元素不再有价值,可以将其覆盖
            for (int j = 1; j <= i; j++) // 从第2个值开始计算打印
            {
                arr2[j] = arr1[j - 1].add(arr1[j]); // 当前值为上一行(arr1中记录的值)中同下标与比当前下标小1的元素和
                System.out.print(arr2[j] + "/t"); // 打印当前元素
                arr1[j - 1] = arr2[j - 1]; // arr1中当前下标对应元素值在下一次计算中会用到, 而下标小1的元素在
                // 本次计算中运用过了,所以将当前计算元素的前一元素赋给arr1
            }
            arr1[i] = arr2[i]; // 本行计算完毕, 将最后一个元素赋给出arr1用于下一行计算

            System.out.println(); // 换行
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值